home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Software Vault: The Gold Collection
/
Software Vault - The Gold Collection (American Databankers) (1993).ISO
/
cdr36
/
putt100.zip
/
CAPI.ZIP
/
JAMFIELD.C
< prev
next >
Wrap
C/C++ Source or Header
|
1993-07-01
|
3KB
|
91 lines
/*
** JAM(mbp) - The Joaquim-Andrew-Mats Message Base Proposal
**
** C API
**
** Written by Joaquim Homrighausen.
**
** ----------------------------------------------------------------------
**
** jamfield.c (JAMmb)
**
** Subfield functions
**
** Copyright 1993 Joaquim Homrighausen, Andrew Milner, Mats Birch, and
** Mats Wallin. ALL RIGHTS RESERVED.
**
** 93-06-28 JoHo
** Initial coding. No decryption or unescaping supported yet.
*/
#define JAMCAPI 1
#include "jammb.h"
#include <string.h>
/*
** Find specified field in passed buffer. It requires that POSITION has
** been reset to zero (0) prior to the first call. the POSITION parameter
** is updated to point to the beginning of the found field.
** Returns 1 if the field is found and 0 if the field is not found.
*/
int _JAMPROC JAMmbFindField(JAMAPIRECptr apirec, UINT32 WhatField, UINT32ptr Position)
{
*Position=JAMsysAlign(*Position);
while (1)
{
apirec->SubFieldPtr=(JAMSUBFIELD *) JAMsysAddPtr(apirec->WorkBuf, *Position);
if (apirec->SubFieldPtr->LoID==(UINT16)WhatField)
/* Found it */
return (1);
else
/* Get next subfield */
{
*Position+=(apirec->SubFieldPtr->DatLen+(UINT32)sizeof(JAMSUBFIELD));
*Position=JAMsysAlign(*Position);
if (*Position>=apirec->WorkLen)
return (0);
}
}/*while*/
/* Dummy return to avoid warnings from some compilers */
return (0);
}
/*
** Add specified field to WorkBuf. It requires that POSITION has been
** reset to zero (0) prior to the first call. The POSITION parameter is
** updated to point to the first position after the newly added field.
** The FIRST parameter determines if the DatLen/ID fields should be
** copied. This allows multiple calls to this function to add more than
** 64kb to a subfield. Returns 1 on success or 0 if the requested field
** does not fit into WorkBuf
*/
int _JAMPROC JAMmbAddField(JAMAPIRECptr apirec, UINT32 WhatField,
int First, unsigned int DatLen,
UINT32ptr Position, CHAR8ptr Data)
{
if (First)
{
*Position=JAMsysAlign(*Position);
if (((UINT32)sizeof(JAMBINSUBFIELD)+(*Position)+DatLen)>apirec->WorkLen)
return (0);
apirec->SubFieldPtr=(JAMSUBFIELD *)JAMsysAddPtr(apirec->WorkBuf,*Position);
apirec->SubFieldPtr->LoID=(UINT16)WhatField;
apirec->SubFieldPtr->HiID=0;
apirec->SubFieldPtr->DatLen=0L;
*Position+=(UINT32)sizeof(JAMBINSUBFIELD);
}
else
{
if ((DatLen+(*Position))>apirec->WorkLen)
return (0);
}
memcpy(JAMsysAddPtr(apirec->WorkBuf,*Position), Data, DatLen);
apirec->SubFieldPtr->DatLen+=DatLen;
*Position+=(UINT32)DatLen;
return (1);
}
/* end of file "jamfield.c" */